#include "app_sysconfig.h"
#include "sdio_sdcard.h"
#include "app_memory.h"
#include "sx1276-Hal.h"

//内存拷贝
void My_memcpy(unsigned char *dsc,unsigned char* src,unsigned int len)
{

    while(len--)
    {
      *dsc++=* src++;

	  }

}

//通用定时器3中断初始化
//arr：自动重装值。
//psc：时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
	
  TIM_TimeBaseInitStructure.TIM_Period = arr; 	//自动重装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
	TIM_Cmd(TIM3,ENABLE); //使能定时器3
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}



// 开关量 输入、输出 初始化
// PE0、PE1 输入 开关量
// PE2、PE3 输出 开关量
void DIO_Init(void)
{

    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA时钟
		//GPIOF9,F10初始化设置
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//100MHz
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
		GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化	
		

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输入模式
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//100MHz
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
		GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化	
    GPIO_ResetBits(GPIOE,GPIO_Pin_2);
	  GPIO_ResetBits(GPIOE,GPIO_Pin_3);

}






void  Send_sys_time(void)
{
  RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
  RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
  printf("Date:20%02d-%02d-%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date); 
  printf("Time:%02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);
  
}	






#define BASE_YEAR   1970 //世纪秒的年份基准，CS_YEAR = 基准 - 1970
#define BASE_MON    1//世纪秒的月份基准，一般是1月
#define BASE_DAY    1 //世纪秒的日基准 ?0?2，一般是1日
unsigned char Montbl[12] = {31,28,31,30,31,30,31,31,30,31,30,31};



//是否闰年
unsigned char IsLeap(int year)
{
	unsigned char res = 0;
  if( (year % 4 == 0) && (year % 4 != 100) )
 {
		res = 1;
 }

 return res;
}


//计算世纪秒 从BASE_YEAR-BASE_MON-BASE_DAY 0时0分0秒到某一时间经过的秒
long GetCS(void)
{
    long res = 0;
    int year_s = BASE_YEAR, mon_s = BASE_MON -1, day_s = BASE_DAY;
    unsigned char leap = 0;//最新年份是否闰年
    RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct); //获取 时间
	  RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);//
    if( IsLeap(RTC_DateStruct.RTC_Year + 2000))
    {
        leap = 1;
    }

    //按年累加
    while(year_s < (RTC_DateStruct.RTC_Year + 2000))
    {
        res += 365 * 24 * 3600;
        if(IsLeap(year_s))
        {
            res += 24 * 3600;
        }

        year_s++;
    }

    //具体到月
    while((mon_s+1) < (RTC_DateStruct.RTC_Month))
    {
        //如果月份为2且是闰年
        if(mon_s == 1 && leap)
        {
            res += (Montbl[mon_s] + 1) * 24 * 3600;
        }
        else
        {
            res += Montbl[mon_s] * 24 * 3600;
        }

        mon_s++;
    }

    //具体到日
    while(day_s < RTC_DateStruct.RTC_Date)
    {
        res += 24 * 3600;
        day_s++;
    }

    //具体到时分秒
    res += 3600 * RTC_TimeStruct.RTC_Hours + 60 * RTC_TimeStruct.RTC_Minutes + RTC_TimeStruct.RTC_Seconds;

    //res -= 3600*8; //东八区 +8小时
    return res;
}



// 外置flash 电源控制角 初始化
void Flash_power_Init(void)
{  
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOA时钟
		//GPIOF9,F10初始化设置
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输入模式
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//100MHz
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
		GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化	
	 // LED_CLOSE;
	  FLASH_OPEN;
}



void LED_power_Init(void)
{  
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIOA时钟
		//GPIOF9,F10初始化设置
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输入模式
		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//100MHz
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
		GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化	
	  FLASH_OPEN;
}


extern void show_sdcard_info(void);
extern SD_CardInfo SDCardInfo;									//SD卡信息
extern void SX1276InitIo( void );
extern void SX1276LoRaInit( void );
// 主板 硬件初始化
void Board_Init(void)
{
   u8 temp=0; 	
   RS485_1_Init(19200);  //调试 环境传感器
   RS485_2_Init(115200); //系统调试串口
   printf(" -----------System start up-------------\r\n ");
	 printf("hello,this app updata progrom\r\n");
	 printf(" -----software vision 2024-3-14-------\r\n ");
   DIO_Init();printf("DIO Init OK\r\n");
   Adc_Init();printf("ADC Init OK\r\n");
   Flash_power_Init();printf("Flash_power_Init OK\r\n");
	 LED_power_Init();  printf("MCU LED Init OK\r\n");
	 Wifi_GPIO_Init(); 
	 Wifi_Init(115200); printf("WIFI UART Init OK\r\n");
	// delay_ms(1000);
	 //delay_ms(1000);     //等待系统稳定,不能省；TF 卡读取会失败。
   if(SD_Init()==1)
	 {
	    printf("SD Card Error,Please Check!\r\n");	
		  error_data[SD_ERR_LIST]=1;
	 }
	 else
	 {	
	   show_sdcard_info();	//打印SD卡相关信息
	   printf("SD Card Size: %d\r\n",(SDCardInfo.CardCapacity>>20));	
	 }
	
	 temp=My_RTC_Init();
	if(temp==0)
	{
	   printf(" Init RTC OK\r\n");
	   RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
	   RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
	   Send_sys_time();		 
	}
	else if(temp==1)
	{
	    printf(" Init RTC LSE error\r\n");	
	}
	else
	{
	    printf(" Init RTC mode error\r\n");
	}
	printf("Get_Bat_VOL:%f\r\n",Get_Bat_VOL());	 //电池 电压
  printf("mcu_temp:%d\r\n",	Get_Temprate()); //芯片温度
	W25QXX_Init();// 外部 flash  初始化
	Check_Flash_Type();
	Read_system_info();//从flash读系统信息
	Print_sys();//打印系统信息，推送时间，设备id，服务器地址，lora id等
	CAT1_1_GPIO_Init();
	CAT1_2_GPIO_Init();
	printf("close cat1 power\r\n");
	printf("close cat2 power\r\n");
	GPIO_ResetBits(GPIOA, GPIO_Pin_11);
	GPIO_ResetBits(GPIOD,GPIO_Pin_10);
	delay_ms(5000);		
  printf("open cat1 power\r\n");
	printf("open cat2 power\r\n");
	GPIO_SetBits(GPIOA, GPIO_Pin_11);//GPIOA11  GPIOA12
	GPIO_SetBits(GPIOD,GPIO_Pin_10);//
	delay_ms(1000);
	CAT1_1_Init(115200);
	CAT1_2_Init(115200);
	Factory_key_Init();
	
	SYS_TIME_FLAG_str.time_120sec_value=0;
	SYS_TIME_FLAG_str.time_120sec_set=3599; //心跳
	SYS_TIME_FLAG_str.time_120sec_en=0;
	SYS_TIME_FLAG_str.CH2_time_120sec_value=0;
	SYS_TIME_FLAG_str.CH2_time_120sec_set=299; //心跳
	SYS_TIME_FLAG_str.CH2_time_120sec_en=0;
		
	SYS_TIME_FLAG_str.time_1200sec_en=1;   //lora 
	SYS_TIME_FLAG_str.time_1200sec_flag=0;
	SYS_TIME_FLAG_str.time_1200sec_value=0;
  SYS_TIME_FLAG_str.CH2_time_1200sec_en=1;   //lora 
	SYS_TIME_FLAG_str.CH2_time_1200sec_flag=0;
	SYS_TIME_FLAG_str.CH2_time_1200sec_value=0;
	SYS_TIME_FLAG_str.CH2_time_1200sec_value=SYS_TIME_FLAG_str.time_1200sec_value;

  SYS_TIME_FLAG_str.time_qixiang_flag=0; //10分钟
	SYS_TIME_FLAG_str.time_qixiang_set=599;
	SYS_TIME_FLAG_str.time_qixiang_en=1;
	SYS_TIME_FLAG_str.CH2_time_qixiang_flag=0; //10分钟
	SYS_TIME_FLAG_str.CH2_time_qixiang_set=599;
	SYS_TIME_FLAG_str.CH2_time_qixiang_en=1;
	
	SYS_TIME_FLAG_str.sys_work_flag=0;   //
	SYS_TIME_FLAG_str.sys_work_set=3599; // 1 hour
	SYS_TIME_FLAG_str.sys_work_value=0;  // 
	SYS_TIME_FLAG_str.sys_work_en=1;     //开机启动
	
	 
	SYS_TIME_FLAG_str.time_read_qx_set=240;///////////////////////////////////////////////////////
	//SYS_TIME_FLAG_str.time_read_qx_set=60;   ///////////////////////////////////////////////////////
	SYS_TIME_FLAG_str.time_read_qx_value=0;
	SYS_TIME_FLAG_str.time_read_qx_en=1; 
	
	
	SYS_TIME_FLAG_str.lora_work_set=10;//lora 工作时间
	SYS_TIME_FLAG_str.lora_work_set1=20;//循环时间
	SYS_TIME_FLAG_str.lora_value=0;
	SYS_TIME_FLAG_str.lora_work_flag=0;//0: 工作；1：关机
	SYS_TIME_FLAG_str.lora_work_en=1;
  
	SYS_TIME_FLAG_str.time_timing_en=0; 
	SYS_TIME_FLAG_str.time_timing_set=86399;
	SYS_TIME_FLAG_str.time_timing_value=0;
	SYS_TIME_FLAG_str.time_timing_flag=0;
   
	SYS_TIME_FLAG_str.CH2_time_timing_en=0; 
	SYS_TIME_FLAG_str.CH2_time_timing_set=86399;
	SYS_TIME_FLAG_str.CH2_time_timing_value=0;
	SYS_TIME_FLAG_str.CH2_time_timing_flag=0;
	
}


//累计 当月 发送流量
void Add_Mouth_Send_Flow(unsigned int num)
{
    RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
    if(SYS_EXT_FLAG_str.Current_Mouth==RTC_DateStruct.RTC_Month) //继续 累计
		{
		   SYS_EXT_FLAG_str.Month_Send_Flow=SYS_EXT_FLAG_str.Month_Send_Flow+num;		
		}
		else
		{
		    SYS_EXT_FLAG_str.Current_Mouth=RTC_DateStruct.RTC_Month;
		    SYS_EXT_FLAG_str.Month_Send_Flow=num;		
		}

}

//累计 当月 发送流量--CH2
void Add_Mouth_Send_Flow1(unsigned int num)
{
    RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
    if(SYS_EXT_FLAG_str1.Current_Mouth==RTC_DateStruct.RTC_Month) //继续 累计
		{
		   SYS_EXT_FLAG_str1.Month_Send_Flow=SYS_EXT_FLAG_str1.Month_Send_Flow+num;		
		}
		else
		{
		    SYS_EXT_FLAG_str1.Current_Mouth=RTC_DateStruct.RTC_Month;
		    SYS_EXT_FLAG_str1.Month_Send_Flow=num;		
		}

}


// 累计当月  接收流量
void Add_Mouth_Rev_FLow(unsigned int num)
{
    RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
    if(SYS_EXT_FLAG_str.Current_Mouth==RTC_DateStruct.RTC_Month) //继续 累计
		{
		   SYS_EXT_FLAG_str.Month_Rev_Flow=SYS_EXT_FLAG_str.Month_Rev_Flow+num;		
		}
		else
		{
		    SYS_EXT_FLAG_str.Current_Mouth=RTC_DateStruct.RTC_Month;
		    SYS_EXT_FLAG_str.Month_Rev_Flow=num;		
		}

}

// 累计当月  接收流量--CH2
void Add_Mouth_Rev_FLow1(unsigned int num)
{
    RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
    if(SYS_EXT_FLAG_str1.Current_Mouth==RTC_DateStruct.RTC_Month) //继续 累计
		{
		   SYS_EXT_FLAG_str1.Month_Rev_Flow=SYS_EXT_FLAG_str1.Month_Rev_Flow+num;		
		}
		else
		{
		    SYS_EXT_FLAG_str1.Current_Mouth=RTC_DateStruct.RTC_Month;
		    SYS_EXT_FLAG_str1.Month_Rev_Flow=num;		
		}

}

//累计 当前 运行时间
void Add_sys_time(unsigned int num)
{
       
    SYS_EXT_FLAG_str.ALL_WORK_TIME=SYS_EXT_FLAG_str.ALL_WORK_TIME+num;
	  
}

//累计 当前 运行时间-CH2
void Add_sys_time1(unsigned int num)
{
       
    SYS_EXT_FLAG_str1.ALL_WORK_TIME=SYS_EXT_FLAG_str1.ALL_WORK_TIME+num;
	  
}

void Add_continue_time(unsigned int num)
{

    SYS_EXT_FLAG_str.CONTINUE_WORK_TIME=SYS_EXT_FLAG_str.CONTINUE_WORK_TIME+num;

}

// CH2
void Add_continue_time1(unsigned int num)
{

    SYS_EXT_FLAG_str1.CONTINUE_WORK_TIME=SYS_EXT_FLAG_str1.CONTINUE_WORK_TIME+num;

}

// 保存 当月 系统 累计时间、流量
void Save_sys_time_Flow(void)
{
      unsigned char read_buf[50]={0};
		  int rec_value=0;
       read_buf[0]=0x5a;
			 read_buf[1]=0x5a;
			 rec_value=SYS_EXT_FLAG_str.ALL_WORK_TIME;
			 read_buf[2]=(rec_value>>24)&0x00ff;
			 read_buf[3]=(rec_value>>16)&0x00ff;
			 read_buf[4]=(rec_value>>8)&0x00ff;
			 read_buf[5]=rec_value&0x00ff;
			 
			 rec_value=SYS_EXT_FLAG_str.CONTINUE_WORK_TIME;
			 read_buf[6]=(rec_value>>24)&0x00ff;
			 read_buf[7]=(rec_value>>16)&0x00ff;
			 read_buf[8]=(rec_value>>8)&0x00ff;
			 read_buf[9]=rec_value&0x00ff;
			
       rec_value=SYS_EXT_FLAG_str.Month_Send_Flow;			
			 read_buf[10]=(rec_value>>24)&0x00ff;
			 read_buf[11]=(rec_value>>16)&0x00ff;
			 read_buf[12]=(rec_value>>8)&0x00ff;
			 read_buf[13]=rec_value&0x00ff;
			 
			 rec_value=SYS_EXT_FLAG_str.Month_Rev_Flow;			
			 read_buf[14]=(rec_value>>24)&0x00ff;
			 read_buf[15]=(rec_value>>16)&0x00ff;
			 read_buf[16]=(rec_value>>8)&0x00ff;
			 read_buf[17]=rec_value&0x00ff;
			 
			 rec_value=SYS_EXT_FLAG_str.Current_Mouth;			
			 read_buf[18]=(rec_value>>24)&0x00ff;
			 read_buf[19]=(rec_value>>16)&0x00ff;
			 read_buf[20]=(rec_value>>8)&0x00ff;
			 read_buf[21]=rec_value&0x00ff;	

       rec_value=SYS_EXT_FLAG_str1.ALL_WORK_TIME;
       read_buf[22]=(rec_value>>24)&0x00ff;
			 read_buf[23]=(rec_value>>16)&0x00ff;
			 read_buf[24]=(rec_value>>8)&0x00ff;
			 read_buf[25]=rec_value&0x00ff;
			 
			 rec_value=SYS_EXT_FLAG_str1.CONTINUE_WORK_TIME;
			 read_buf[26]=(rec_value>>24)&0x00ff;
			 read_buf[27]=(rec_value>>16)&0x00ff;
			 read_buf[28]=(rec_value>>8)&0x00ff;
			 read_buf[29]=rec_value&0x00ff;
			
       rec_value=SYS_EXT_FLAG_str1.Month_Send_Flow;			
			 read_buf[30]=(rec_value>>24)&0x00ff;
			 read_buf[31]=(rec_value>>16)&0x00ff;
			 read_buf[32]=(rec_value>>8)&0x00ff;
			 read_buf[33]=rec_value&0x00ff;
			 
			 rec_value=SYS_EXT_FLAG_str1.Month_Rev_Flow;			
			 read_buf[34]=(rec_value>>24)&0x00ff;
			 read_buf[35]=(rec_value>>16)&0x00ff;
			 read_buf[36]=(rec_value>>8)&0x00ff;
			 read_buf[37]=rec_value&0x00ff;
			 
			 rec_value=SYS_EXT_FLAG_str1.Current_Mouth;			
			 read_buf[38]=(rec_value>>24)&0x00ff;
			 read_buf[39]=(rec_value>>16)&0x00ff;
			 read_buf[40]=(rec_value>>8)&0x00ff;
			 read_buf[41]=rec_value&0x00ff;
			 W25QXX_Write(read_buf,system_info_addr1,50);		 
			 printf("SIM1--ALL_WORK_TIME:%d\r\n",SYS_EXT_FLAG_str.ALL_WORK_TIME);
			 printf("SIM1--CONTINUE_WORK_TIME:%d\r\n",SYS_EXT_FLAG_str.CONTINUE_WORK_TIME);
			 printf("SIM1--Month_Send_Flow:%d\r\n",SYS_EXT_FLAG_str.Month_Send_Flow);
			 printf("SIM1--Month_Rev_Flow:%d\r\n",SYS_EXT_FLAG_str.Month_Rev_Flow);
			 delay_ms(100);
			 //FLASH_CLOSE;
			 

}


// 读取 当月 系统 累计时间、流量
void Read_sys_time_Flow(void)
{




}



static unsigned short time_k=0;
extern unsigned char time_10s_flag;
extern volatile uint32_t TickCounter;
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
	{
		//LOG_PRINT("TIM3 come into TIM3\n");
	   
		 if(SYS_TIME_FLAG_str.time_120sec_en==1) //心跳包 标志位--CH1
		 {
		      SYS_TIME_FLAG_str.time_120sec_value++;
			    if(SYS_TIME_FLAG_str.time_120sec_value>SYS_TIME_FLAG_str.time_120sec_set)
					{
					     SYS_TIME_FLAG_str.time_120sec_flag=1;
						   SYS_TIME_FLAG_str.time_120sec_value=0;		
					}		 
		 }
		 
		 if(SYS_TIME_FLAG_str.CH2_time_120sec_en==1) //心跳包 标志位--CH2
		 {
		      SYS_TIME_FLAG_str.CH2_time_120sec_value++;
			    if(SYS_TIME_FLAG_str.CH2_time_120sec_value>SYS_TIME_FLAG_str.CH2_time_120sec_set)
					{
					     SYS_TIME_FLAG_str.CH2_time_120sec_flag=1;
						   SYS_TIME_FLAG_str.CH2_time_120sec_value=0;		
					}		 
		 }
		 
		 /////////////////////////////////////////////////////////
		 if(SYS_TIME_FLAG_str.time_1200sec_en==1)  //lora 包 标志位--CH1
		 {
		      SYS_TIME_FLAG_str.time_1200sec_value++;
			    if(SYS_TIME_FLAG_str.time_1200sec_value>SYS_TIME_FLAG_str.time_1200sec_set)
					{
					     SYS_TIME_FLAG_str.time_1200sec_flag=1;						
						   SYS_TIME_FLAG_str.time_1200sec_value=0;					
					}	 
		 }
		  if(SYS_TIME_FLAG_str.CH2_time_1200sec_en==1)  //lora 包 标志位--CH2
		 {
		      SYS_TIME_FLAG_str.CH2_time_1200sec_value++;
			    if(SYS_TIME_FLAG_str.CH2_time_1200sec_value>SYS_TIME_FLAG_str.CH2_time_1200sec_set)
					{
						LOG_PRINT("TIM3 set CH2 1200sec_flag \n");
						LOG_PRINT("SYS_TIME_FLAG_str.CH2_time_1200sec_set:%d\n",SYS_TIME_FLAG_str.CH2_time_1200sec_set);
					     SYS_TIME_FLAG_str.CH2_time_1200sec_flag=1;						
						   SYS_TIME_FLAG_str.CH2_time_1200sec_value=0;					
					}	 
		 }
		  
		 
		 /////////////////////////////////////////////////////////////
     if(SYS_TIME_FLAG_str.time_qixiang_en==1)  //气象包标志位----平台 发送 标志位--CH1
     {
		    SYS_TIME_FLAG_str.time_qixiang_value++;
			  if(SYS_TIME_FLAG_str.time_qixiang_value>SYS_TIME_FLAG_str.time_qixiang_set)
				{
							SYS_TIME_FLAG_str.time_qixiang_flag=1;
					    SYS_TIME_FLAG_str.time_qixiang_value=0;				
				}	 
		 }
		 
		 
		 if(SYS_TIME_FLAG_str.CH2_time_qixiang_en==1)  //气象包标志位----平台 发送 标志位--CH2
     {
		    SYS_TIME_FLAG_str.CH2_time_qixiang_value++;
			  if(SYS_TIME_FLAG_str.CH2_time_qixiang_value>SYS_TIME_FLAG_str.CH2_time_qixiang_set)
				{
							SYS_TIME_FLAG_str.CH2_time_qixiang_flag=1;
					    SYS_TIME_FLAG_str.CH2_time_qixiang_value=0;				
				}	 
		 }
		 ////////////////////////////////////////////////////////////////
     if(SYS_TIME_FLAG_str.sys_work_en==1)		  //设备工作 时间标志位
		 {	 
		      SYS_TIME_FLAG_str.sys_work_value++;
			    if(SYS_TIME_FLAG_str.sys_work_value>SYS_TIME_FLAG_str.sys_work_set)
					{
					    SYS_TIME_FLAG_str.sys_work_flag=1;
						  SYS_TIME_FLAG_str.sys_work_value=0;				
					}	 
//					if(SYS_TIME_FLAG_str.sys_work_value>(SYS_TIME_FLAG_str.sys_work_set-3))
//					{
//					     FLASH_OPEN;
//					}
		 }
		 if(SYS_TIME_FLAG_str.time_read_qx_en==1)  //硬件 定时 轮询 查找气象设备
		 {
		      SYS_TIME_FLAG_str.time_read_qx_value++;
			    if(SYS_TIME_FLAG_str.time_read_qx_value>SYS_TIME_FLAG_str.time_read_qx_set)
					{
					     SYS_TIME_FLAG_str.time_read_qx_flag=1;
						   SYS_TIME_FLAG_str.time_read_qx_value=0;			
					}	 
		 }	 
		 
		 if(SYS_TIME_FLAG_str.lora_work_en==1)
		 {
		    SYS_TIME_FLAG_str.lora_value++;
			  if(SYS_TIME_FLAG_str.lora_value==SYS_TIME_FLAG_str.lora_work_set)//工作时间到，进入关机状态
				{
				     SYS_TIME_FLAG_str.lora_work_flag=1;//关机
				}
				 if(SYS_TIME_FLAG_str.lora_value==SYS_TIME_FLAG_str.lora_work_set1)//关机时间到，进入工作状态
				{
				     SYS_TIME_FLAG_str.lora_work_flag=0;//开机
					   SYS_TIME_FLAG_str.lora_value=0;
				}
					
		 	
		   
		 }
     
          if(SYS_TIME_FLAG_str.time_timing_en==1)  
     {
		    SYS_TIME_FLAG_str.time_timing_value++;
			  if(SYS_TIME_FLAG_str.time_timing_value>SYS_TIME_FLAG_str.time_timing_set)
				{
							SYS_TIME_FLAG_str.time_timing_flag=1;
					    SYS_TIME_FLAG_str.time_timing_value=0;				
				}	 
		 }
		 
		 
		 if(SYS_TIME_FLAG_str.CH2_time_timing_en==1)  
     {
		    SYS_TIME_FLAG_str.CH2_time_timing_value++;
			  if(SYS_TIME_FLAG_str.CH2_time_timing_value>SYS_TIME_FLAG_str.CH2_time_timing_set)
				{
							SYS_TIME_FLAG_str.CH2_time_timing_flag=1;
					    SYS_TIME_FLAG_str.CH2_time_timing_value=0;				
				}	 
		 }
		 lora_reset_time++;
	
	}
	IWDG_Feed();//喂狗

	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
	GPIO_ToggleBits(GPIOD,GPIO_Pin_0);
	
}


void Clear_SYSTEM_INFO_str(unsigned char ch)
{
   switch(ch)
	 {
	   case 0:memset(SYSTEM_INFO_str.lora_1_addr,0,50);break;
		 case 1:memset(SYSTEM_INFO_str.lora_2_addr,0,50);break;
		 case 2:memset(SYSTEM_INFO_str.lora_3_addr,0,50);break;
		 case 3:memset(SYSTEM_INFO_str.lora_4_addr,0,50);break;
		 case 4:memset(SYSTEM_INFO_str.lora_5_addr,0,50);break;
		 case 5:memset(SYSTEM_INFO_str.lora_6_addr,0,50);break;
		 case 6:memset(SYSTEM_INFO_str.lora_7_addr,0,50);break;
		 case 7:memset(SYSTEM_INFO_str.lora_8_addr,0,50);break;
		 case 8:memset(SYSTEM_INFO_str.lora_9_addr,0,50);break;
		 case 9:memset(SYSTEM_INFO_str.lora_10_addr,0,50);break;
		 case 10:memset(SYSTEM_INFO_str.lora_11_addr,0,50);break;
		 case 11:memset(SYSTEM_INFO_str.lora_12_addr,0,50);break;
		 case 12:memset(SYSTEM_INFO_str.lora_13_addr,0,50);break;
		 case 13:memset(SYSTEM_INFO_str.lora_14_addr,0,50);break;
		 case 14:memset(SYSTEM_INFO_str.lora_15_addr,0,50);break;
		 case 15:memset(SYSTEM_INFO_str.lora_16_addr,0,50);break;
		 case 16:memset(SYSTEM_INFO_str.lora_17_addr,0,50);break;
		 case 17:memset(SYSTEM_INFO_str.lora_18_addr,0,50);break;
	   case 18:memset(SYSTEM_INFO_str.lora_19_addr,0,50);break;
		 case 19:memset(SYSTEM_INFO_str.lora_20_addr,0,50);break;
		 case 20:memset(SYSTEM_INFO_str.lora_21_addr,0,50);break;
		 case 21:memset(SYSTEM_INFO_str.lora_22_addr,0,50);break;
		 case 22:memset(SYSTEM_INFO_str.lora_23_addr,0,50);break;
		 case 23:memset(SYSTEM_INFO_str.lora_24_addr,0,50);break;
	   default:break;
	 
	 }

}


unsigned char Check_device_id(unsigned short id)
{
    unsigned char i=0;
	  for(i=0;i<24;i++)
	  {
		      if(RingQueue_readbuf[i].device_id==id) // 有 id 返回 1
					{						 						
              return 1;
               //break;
					}	
		}
		return 0;


}


//新增 插入
unsigned char Insert_lora_id(unsigned short device_id)
{
    unsigned char i=0;
	  if(Check_device_id(device_id)==1) //存在相同的id
    {
			 printf("device id is already,please check\r\n");
		   return 0;
		}
	  for(i=0;i<24;i++)
	  {
		      if((RingQueue_readbuf[i].device_id==0)||(RingQueue_readbuf[i].device_id==0xffff)) //认为是 不存在的id，有空余的位置
					{
						  RingQueue_readbuf[i].device_id=device_id;
						  Get_num_char(device_id,i);	
              return 1;
               //break;
					 }	
		}
		return 0;
}

// 替换 插入
unsigned char Replace_lora_id(unsigned short src_device_id,unsigned short dst_device_id)
{

    unsigned char i=0;
	  for(i=0;i<24;i++)
	  {
		      if(RingQueue_readbuf[i].device_id==src_device_id) //查找 对应的id 号
					{
						  Clear_SYSTEM_INFO_str(i);
						  RingQueue_readbuf[i].device_id=dst_device_id;
						  Get_num_char(dst_device_id,i);	
              return 1;
               //break;
					 }	
		}
		return 0;
}


// 国网 数据  检验
unsigned char Check_crc_guowang(unsigned char *buf,unsigned short len)
{
    
		unsigned short crc=0;
	  unsigned char crc_h=0,crc_l=0;
		crc=mc_check_crc16(buf+2,len-5);
	  crc_h=crc>>8;
	  crc_l=crc&0x00ff;
	  if((crc_h==buf[len-2])&&(crc_l==buf[len-3])) //校验 OK
		{
		   return 1;
		
		}
		else                                       // 校验 不 OK
		{
		    return 0;
		}
}


// 南网 数据  检验
unsigned char Check_crc_nanwang(unsigned char *buf,unsigned short len)
{
     unsigned char send_buf[20]={0};
		 unsigned short i=0;
		 unsigned char crc=0;
		 
		 for(i=0;i<len-2;i++)
		 {			 
			 crc=crc+buf[1+i];	    
		 }
		 crc =~crc;
		 if(crc==buf[len-2])
		 {
			 return 1;
		 }
		 else
		 {
			 return 0;
		 }
		 
}

void My_go_lowpower(void)
{
	//printf("start low power\r\n");
  SCB->SCR |=0X00;   

	#if defined ( __CC_ARM   )                          
  __force_stores();
	#endif
  /* Request Wait For Interrupt */
  __WFI();


}


void Reboot(void)
{
   __set_FAULTMASK(1); // 关闭所有中断

  NVIC_SystemReset(); // 复位

}


